#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;
void  inverse(LinkList L)
{// 逆置带头结点的单链表 L
    LNode *p=L->next;  
    L->next=NULL;
    while (p) {
        LNode *q=p->next;    // q指向*p的后继
        p->next=L->next;
        L->next=p;       // *p插入在头结点之后
        p = q;
    }
}
void ShowList(LinkList L){
    LNode *p=L->next;
    while (p) {
        printf("%d ",p->data);
        p=p->next;
    } 
}
void deleteOddIndex(LinkList L){
    LNode *p=L->next;
    int j=1;
    LNode *pre=NULL;  
    while (p) {        
        pre=p;
        p=p->next; 
        j++;
        if(j%2==0&&p){
            printf("delete indx=%d,data=%d\n",j,p->data);
            pre->next=p->next;
            free(p);
            p=pre;
        }        
    } 
}

void insertList(LinkList L){
    LNode *p=L->next;
    LNode *pre=p;  
    LNode* node1=(LNode*)malloc(sizeof(LNode));
	printf("input data:");
	scanf("%d",&node1->data);
    node1->next=NULL;
    if(p&&p->data>node1->data){//插入链表头部
        L->next=node1;
        node1->next=p;
        return;
    }
    while (p) {
        if(p->data>=node1->data){
            pre->next=node1;
            node1->next=p; 
            break;
        }
        pre=p;
        p=p->next;
    } 
    if(node1->next==NULL){//插入链表尾部
        pre->next=node1;
    }
}
void BuildList(LinkList L)
{
    int m;
    printf("list size。m=");
    scanf("%d",&m);
	printf("\nstart setup...\n");
    LNode* pre=L;
	for(int i=0;i<m;i++)
	{
	   printf("\n请输入第%d个元素：",i+1);
       LNode* node1=(LNode*)malloc(sizeof(LNode));
	   scanf("%d",&node1->data);
       node1->next=NULL;
       if(i==0){
        L->next=node1;
       }else{
         pre->next=node1;
       }
       pre=node1;
	}
	printf("\ncomplete！...\n");
}

int main(){
    LinkList L=(LinkList)malloc(sizeof(LNode));//LNODE* L=(LNODE*)malloc(sizeof(LNODE));
    L->next=NULL;
    int n;
  	while(1)
  	{
  		printf("\n                 实验二：单向链表\n");
  		printf("\n   ****************************");
  		printf("\n       1.创建表");
  		printf("\n       2.遍历表");
  		printf("\n       3.删除偶数结点");
  		printf("\n       4.递增链表插入元素，仍是有序链表");
  		printf("\n       0.退出");
		printf("\n   ****************************");
		printf("\n请输入选择序号："); 
		scanf("%d",&n);
		switch(n)
		{
			case 0:
				return 0;
			case 1:
			    BuildList(L);
			    break;
			case 2:
			    ShowList(L);
			    break;
			case 3:
				deleteOddIndex(L);
			    break;
			case 4:	
			    insertList(L);
			    break;
			case 5:  
			    //sortList(L);
			    break;
			default:
				printf("请输入数字0-5\n");
		}
	  }
	  return 0;

}